package com.ruoyi.system.service;

import java.util.List;
import java.util.Map;
import com.ruoyi.system.domain.OjProblem;
import com.ruoyi.system.domain.OjSubmission;

/**
 * OJ在线练习Service接口
 * 
 * @author ruoyi
 * @date 2025-01-21
 */
public interface IOjPracticeService 
{
    /**
     * 查询OJ题目
     * 
     * @param problemId OJ题目主键
     * @return OJ题目
     */
    public OjProblem selectProblemById(String problemId);

    /**
     * 查询OJ题目列表
     * 
     * @param keyword 搜索关键词
     * @param difficulty 难度等级
     * @param category 题目类别
     * @param status 完成状态
     * @return OJ题目集合
     */
    public List<OjProblem> selectProblemList(String keyword, String difficulty, String category, String status);

    /**
     * 新增OJ题目
     * 
     * @param ojProblem OJ题目
     * @return 结果
     */
    public int insertProblem(OjProblem ojProblem);

    /**
     * 修改OJ题目
     * 
     * @param ojProblem OJ题目
     * @return 结果
     */
    public int updateProblem(OjProblem ojProblem);

    /**
     * 批量删除OJ题目
     * 
     * @param problemIds 需要删除的OJ题目主键集合
     * @return 结果
     */
    public int deleteProblemByProblemIds(String problemIds);

    /**
     * 删除OJ题目信息
     * 
     * @param problemId OJ题目主键
     * @return 结果
     */
    public int deleteProblemByProblemId(String problemId);

    /**
     * 查询OJ代码提交
     * 
     * @param submissionId OJ代码提交主键
     * @return OJ代码提交
     */
    public OjSubmission selectSubmissionById(String submissionId);

    /**
     * 查询OJ代码提交列表
     * 
     * @param userId 用户ID
     * @param problemId 题目ID
     * @param status 提交状态
     * @param language 编程语言
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return OJ代码提交集合
     */
    public List<OjSubmission> selectSubmissionList(String userId, String problemId, String status, String language, String startTime, String endTime);

    /**
     * 新增OJ代码提交
     * 
     * @param ojSubmission OJ代码提交
     * @return 结果
     */
    public int insertSubmission(OjSubmission ojSubmission);

    /**
     * 修改OJ代码提交
     * 
     * @param ojSubmission OJ代码提交
     * @return 结果
     */
    public int updateSubmission(OjSubmission ojSubmission);

    /**
     * 批量删除OJ代码提交
     * 
     * @param submissionIds 需要删除的OJ代码提交主键集合
     * @return 结果
     */
    public int deleteSubmissionBySubmissionIds(String submissionIds);

    /**
     * 删除OJ代码提交信息
     * 
     * @param submissionId OJ代码提交主键
     * @return 结果
     */
    public int deleteSubmissionBySubmissionId(String submissionId);

    /**
     * 获取题目测试用例
     * 
     * @param problemId 题目ID
     * @return 测试用例列表
     */
    public List<Map<String, Object>> getProblemTestCases(String problemId);

    /**
     * 运行代码
     * 
     * @param problemId 题目ID
     * @param code 代码内容
     * @param language 编程语言
     * @param input 输入数据
     * @param enableO2 是否开启O2优化
     * @return 运行结果
     */
    public Map<String, Object> runCode(String problemId, String code, String language, String input, Boolean enableO2);

    /**
     * 提交代码
     * 
     * @param problemId 题目ID
     * @param code 代码内容
     * @param language 编程语言
     * @param enableO2 是否开启O2优化
     * @param submissionType 提交类型
     * @return 提交ID
     */
    public String submitCode(String problemId, String code, String language, Boolean enableO2, String submissionType);

    /**
     * 获取提交结果
     * 
     * @param submissionId 提交ID
     * @return 提交结果
     */
    public Map<String, Object> getSubmissionResult(String submissionId);

    /**
     * 获取提交统计
     * 
     * @param userId 用户ID
     * @param timeRange 时间范围
     * @return 统计信息
     */
    public Map<String, Object> getSubmissionStats(String userId, String timeRange);

    /**
     * 获取支持的编程语言
     * 
     * @return 语言列表
     */
    public List<Map<String, Object>> getSupportedLanguages();

    /**
     * 获取语言配置
     * 
     * @param language 编程语言
     * @return 语言配置
     */
    public Map<String, Object> getLanguageConfig(String language);

    /**
     * 获取题目排行榜
     * 
     * @param problemId 题目ID
     * @param rankingType 排行类型
     * @param limit 限制数量
     * @return 排行榜
     */
    public List<Map<String, Object>> getProblemRanking(String problemId, String rankingType, Integer limit);

    /**
     * 获取用户解题进度
     * 
     * @param userId 用户ID
     * @return 解题进度
     */
    public Map<String, Object> getUserProgress(String userId);

    /**
     * 获取题目分类
     * 
     * @return 分类列表
     */
    public List<Map<String, Object>> getProblemCategories();

    /**
     * 获取题目标签
     * 
     * @return 标签列表
     */
    public List<Map<String, Object>> getProblemTags();

    /**
     * 获取相关题目推荐
     * 
     * @param problemId 题目ID
     * @param userId 用户ID
     * @param limit 推荐数量
     * @return 相关题目列表
     */
    public List<Map<String, Object>> getRelatedProblems(String problemId, String userId, Integer limit);

    /**
     * 获取题目讨论
     * 
     * @param problemId 题目ID
     * @return 讨论列表
     */
    public List<Map<String, Object>> getProblemDiscussions(String problemId);

    /**
     * 添加题目讨论
     * 
     * @param problemId 题目ID
     * @param title 讨论标题
     * @param content 讨论内容
     * @param type 讨论类型
     * @return 结果
     */
    public int addProblemDiscussion(String problemId, String title, String content, String type);

    /**
     * 获取题目解决方案
     * 
     * @param problemId 题目ID
     * @param language 编程语言
     * @return 解决方案列表
     */
    public List<Map<String, Object>> getProblemSolutions(String problemId, String language);

    /**
     * 获取代码模板
     * 
     * @param language 编程语言
     * @param problemType 题目类型
     * @return 代码模板
     */
    public Map<String, Object> getCodeTemplate(String language, String problemType);

    /**
     * 保存代码草稿
     * 
     * @param problemId 题目ID
     * @param code 代码内容
     * @param language 编程语言
     * @param userId 用户ID
     * @return 结果
     */
    public int saveCodeDraft(String problemId, String code, String language, String userId);

    /**
     * 获取代码草稿
     * 
     * @param problemId 题目ID
     * @param userId 用户ID
     * @return 代码草稿
     */
    public Map<String, Object> getCodeDraft(String problemId, String userId);

    /**
     * 获取代码草稿列表
     * 
     * @param userId 用户ID
     * @return 草稿列表
     */
    public List<Map<String, Object>> getCodeDraftList(String userId);

    /**
     * 删除代码草稿
     * 
     * @param draftId 草稿ID
     * @return 结果
     */
    public int deleteCodeDraft(String draftId);

    /**
     * 获取系统状态
     * 
     * @return 系统状态
     */
    public Map<String, Object> getSystemStatus();

    /**
     * 获取系统配置
     * 
     * @return 系统配置
     */
    public Map<String, Object> getSystemConfig();

    /**
     * 获取用户OJ统计信息
     * 
     * @param userId 用户ID
     * @return 统计信息
     */
    public Map<String, Object> getUserOjStats(String userId);

    /**
     * 获取OJ排行榜
     * 
     * @param rankingType 排行类型
     * @param timeRange 时间范围
     * @param limit 限制数量
     * @return 排行榜
     */
    public List<Map<String, Object>> getOjRanking(String rankingType, String timeRange, Integer limit);
} 